package site.marqstree.smartbutler.ui;

import android.content.Intent;
import android.os.Bundle;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import site.marqstree.smartbutler.MainActivity;
import site.marqstree.smartbutler.R;

/*
 * 项目名: SmartButler
 * 包名: site.marqstree.smartbutler.ui
 * 文件名: GuideActivity
 * 创建者: marqstree
 * 创建时间: 2019/12/30 10:26
 * 描述: 引导页
 */
public class GuideActivity extends AppCompatActivity {

    //定义页数
    private final int PAGE_COUNT = 3;

    @BindView(R.id.viewPager)
    ViewPager mViewPager;

    @BindView(R.id.point1)
    ImageView mPoint1;

    @BindView(R.id.point2)
    ImageView mPoint2;

    @BindView(R.id.point3)
    ImageView mPoint3;

    @BindView(R.id.iv_back)
    ImageView mIvBack;

    Button mBtnStart;

    //页面Fragment数组
    //SparseArray:Android特有，类似Map，key为int，value为Object，比Map效率高
    private SparseArray<View> mViews = new SparseArray<>();
    //3个原点ImageView控件数组
    private List<ImageView> mSpots = new ArrayList<>();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_guide);
        ButterKnife.bind(this);

        //初始化ViewPager
        initViewPager();

        //初始化导航原点
        initSpots();
    }

    //初始化导航原点
    private void initSpots() {
        mSpots.add(mPoint1);
        mSpots.add(mPoint2);
        mSpots.add(mPoint3);
        //点亮第一个原点
        selectSpot(0);
    }

    //选中原点
    private void selectSpot(int position) {
        if (position >= PAGE_COUNT)
            return;

        //将position对应原点点亮
        //其它原点熄灭
        for (int i = 0; i < PAGE_COUNT; i++) {
            if (position == i) {
                mSpots.get(i)
                        .setBackgroundResource(R.drawable.point_on);

            } else {
                mSpots.get(i)
                        .setBackgroundResource(R.drawable.point_off);
            }
        }
    }

    //初始化ViewPager
    private void initViewPager() {

        //同时渲染3个子组件
        // 避免第2个滑出第3个子组件时，
        // 先白（背景色）再蓝（渲染色，渲染需要时间）
        mViewPager.setOffscreenPageLimit(PAGE_COUNT);

        //给ViewPager绑定页面
        mViewPager.setAdapter(new GuidePagerAdapter());

        //ViewPager滑动事件
        mViewPager.addOnPageChangeListener(new GuidePageChangeListener());
    }

    @OnClick(R.id.iv_back)
    public void onViewClicked() {
        gotoLogin();
    }

    //自定义ViewPager的适配器
    class GuidePagerAdapter extends PagerAdapter {

        //返回页面数量
        @Override
        public int getCount() {
            return PAGE_COUNT;
        }

        //这个函数就是用来告诉框架，这个view的id是不是这个object。
        //谷歌官方推荐把view当id用，所以常规的instantiateItem（）函数的返回值是你自己定义的view，
        //而isViewFromObject（）的返回值是view == object
        @Override
        public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
            return view == object;
        }

        //ViewPager里面对每个页面的管理是key-value形式的，
        // 也就是说每个page都有个对应的id（id是object类型），需要对page操作的时候都是通过id来完成的
        //此函数功能就是往PageView里添加自己需要的page。同时注意它还有个返回值object，这就是那个id
        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, int position) {
            View page = null;
            switch (position) {
                case 0:
                    page = View.inflate(GuideActivity.this,
                            R.layout.pager_item_one,
                            null);
                    break;
                case 1:
                    page = View.inflate(GuideActivity.this,
                            R.layout.pager_item_two,
                            null);
                    break;
                case 2:
                    page = View.inflate(GuideActivity.this,
                            R.layout.pager_item_three,
                            null);
                    mBtnStart = page.findViewById(R.id.btn_start);
                    mBtnStart.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            switch (v.getId()) {
                                case R.id.btn_start:
                                    //跳转到登陆页面
                                    gotoLogin();
                                    break;
                            }
                        }
                    });
                    break;
                default:
                    break;
            }
            //加入数组
            mViews.put(position, page);
            //加入ViewPager
            //此处的container就是ViewPager
            container.addView(page);
            return page;
        }

        //销毁页面
        @Override
        public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
            container.removeView((View) object);
        }
    }

    //跳转到主页面
    private void gotoLogin() {
        startActivity(new Intent(GuideActivity.this, LoginActivity.class));
        finish();
    }

    class GuidePageChangeListener implements ViewPager.OnPageChangeListener {

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            //切换点亮导航原点
            selectSpot(position);

            //切换到最后一页时，
            //隐藏跳过按钮
            if(position == (PAGE_COUNT-1) )
                mIvBack.setVisibility(View.GONE);
            else
                mIvBack.setVisibility(View.VISIBLE);
        }

        //跳过Splash页，进入主页面
        @Override
        public void onPageScrollStateChanged(int state) {

        }
    }

}
